home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / program / misc / smalltlk.lha / Smalltalk3.09 / src / muiprim.c < prev    next >
C/C++ Source or Header  |  1995-08-27  |  7KB  |  270 lines

  1. /* 
  2.     MUI primitives
  3.     written by David Faught, July 1995
  4. */
  5.  
  6. # include "muist.h"
  7. # include "env.h"
  8. # include "memory.h"
  9. # include "names.h"
  10.  
  11. #ifndef MAKE_ID
  12. #define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
  13. #endif
  14.  
  15. extern object trueobj, falseobj;
  16. extern boolean parseok;
  17. extern int initial;
  18.  
  19. /* A little array definition */
  20. extern const char LVT_STinit[];
  21.  
  22. /* Conventional GadTools NewMenu structure, a memory saving way of defining menus */
  23. extern struct NewMenu Menu[];
  24.  
  25. /* Pointers for some MUI objects */
  26. extern APTR AP_Small;
  27. extern APTR LV_Classes, LV_Methods, LV_Text, LV_Console;
  28. extern APTR ST_Console;
  29.  
  30. object sysPrimitive(primitiveNumber, arguments)
  31. int primitiveNumber;
  32. object *arguments;
  33. {    int i, j, k;
  34.     char *c, *d;
  35.     object returnedObject;
  36.     struct Window *window;
  37.     struct Gadget *gadget;
  38.     char *text;
  39.     ULONG size;
  40.     char buf[200];
  41.  
  42.     returnedObject = nilobj;
  43.  
  44.     switch(primitiveNumber) {
  45.     case 160:    /* open window */
  46.         i = intValue(arguments[0]);
  47.         set(wins[i], MUIA_Window_Open, TRUE);
  48.         break;
  49.  
  50.     case 161:    /* close window */
  51.         i = intValue(arguments[0]);
  52.         set(wins[i], MUIA_Window_Open, FALSE);
  53.         break;
  54.  
  55.     case 170:    /* get next event */
  56.         i = intValue(arguments[0]);
  57.         {
  58.         ULONG signal,event;
  59.         char *buf;
  60.  
  61.         event=(DoMethod(AP_Small, MUIM_Application_Input, &signal));
  62.         if (event == 0 && signal != 0 && i < 2) {
  63.             Wait(signal);
  64.             event=(DoMethod(AP_Small, MUIM_Application_Input, &signal));
  65.             }
  66.         returnedObject = newInteger(event);
  67.         }
  68.         break;
  69.  
  70.     case 171:    /* integer event info */
  71.         i = intValue(arguments[0]);
  72.         /* for this primitive only, default to non-nil returnedObject */
  73.         returnedObject = newStString(""); /* this is not nilobj */
  74.         switch(i) {
  75.             case MUIV_Application_ReturnID_Quit:
  76.                 returnedObject = nilobj;
  77.                 break;
  78.  
  79.             case ID_NEWCON:
  80.                 get(ST_Console,MUIA_String_Contents,&text);
  81.                 sprintf(buf, ">    %s", text);
  82.                 putCons(buf);
  83.                 returnedObject = newStString(text);
  84.                 set(ST_Console,MUIA_String_Contents,"");
  85.                 set(wins[0],MUIA_Window_ActiveObject,ST_Console);
  86.                 break;
  87.  
  88.             case ID_NEWCLA:
  89.                 DoMethod(LV_Classes, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &text);
  90.                 returnedObject = newStString(text);
  91.                 break;
  92.  
  93.             case ID_NEWMET:
  94.                 DoMethod(LV_Methods, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &text);
  95.                 returnedObject = newStString(text);
  96.                 break;
  97.  
  98.             case ID_ABOUT:
  99.                 genRequest(LVT_STinit);
  100.                 break;
  101.         }
  102.         break;
  103.  
  104.     case 180:    /* clear browser Classes listview list */
  105.         i = intValue(arguments[0]); /* win number? */
  106.         DoMethod(LV_Classes, MUIM_List_Clear);
  107.         break;
  108.  
  109.     case 181:    /* add an item to browser Classes listview list */
  110.         i = intValue(arguments[0]); /* win number? */
  111.         c = charPtr(arguments[1]); /* new item text */
  112.         DoMethod(LV_Classes, MUIM_List_InsertSingle, c, MUIV_List_Insert_Sorted);
  113.         break;
  114.  
  115.     case 182:    /* clear browser Methods listview list */
  116.         i = intValue(arguments[0]);
  117.         DoMethod(LV_Methods, MUIM_List_Clear);
  118.         break;
  119.  
  120.     case 183:    /* add an item to browser Methods listview list */
  121.         i = intValue(arguments[0]); /* win number? */
  122.         c = charPtr(arguments[1]); /* new item text */
  123.         DoMethod(LV_Methods, MUIM_List_InsertSingle, c, MUIV_List_Insert_Sorted);
  124.         break;
  125.  
  126.     case 185:    /* add an item to browser Text listview list */
  127.         i = intValue(arguments[0]); /* win number? */
  128.         c = charPtr(arguments[1]); /* new item text */
  129.         set(LV_Text, MUIA_Floattext_Text, c);
  130.         break;
  131.  
  132.     case 191:    /* menu item */
  133.         i = intValue(arguments[0]); /* menu number */
  134.         c = charPtr(arguments[1]); /* title */
  135.         break;
  136.  
  137.     case 200:    /* issue a message */
  138.         c = charPtr(arguments[0]);
  139.         putCons(c);
  140.         break;
  141.  
  142.     case 201:    /* requester message */
  143.         c = charPtr(arguments[0]);
  144.         genRequest(c);
  145.         break;
  146.  
  147.     case 202:    /* ask a binary question */
  148.         c = charPtr(arguments[0]);
  149.         i = MUI_Request(AP_Small, wins[0], 0, NULL, "_Yes|_No", c);
  150.         if (i == 1) returnedObject = trueobj;
  151.         else if (i == 0) returnedObject = falseobj;
  152.         break;
  153.  
  154.     case 203:    /* ask for a file */
  155.         c = charPtr(arguments[0]);
  156. {
  157.     APTR win, TX_Request, ST_Request;
  158.     ULONG signal;
  159.     boolean running = TRUE;
  160.  
  161.     set(AP_Small,MUIA_Application_Sleep,TRUE);    /* disable other windows */
  162.     win = WindowObject, MUIA_Window_Title, "Smalltalk", MUIA_Window_ID, MAKE_ID('R','E','Q','F'), WindowContents,
  163.             VGroup,
  164.                 Child, TX_Request = TextObject,    TextFrame, End,
  165.                 Child, ST_Request = PopaslObject,
  166.                     MUIA_Popstring_String, KeyString(0,256,'f'),
  167.                     MUIA_Popstring_Button, PopButton(MUII_PopFile),
  168.                     ASL_Hail, "Please select a file...",
  169.                     ASL_Pattern, "#?.st",
  170.                     ASL_FuncFlags, FILF_PATGAD,
  171.                     End,
  172.                 End,
  173.             End;
  174.  
  175.     if (win)                /* ok ? */
  176.     {
  177.         DoMethod(AP_Small,OM_ADDMEMBER,win);    /* add window... */
  178.         DoMethod(ST_Request,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,MUIV_Notify_Application,2,MUIM_Application_ReturnID,ID_REQU);
  179.         set(TX_Request,MUIA_Text_Contents,c);
  180.         set(win,MUIA_Window_Open,TRUE);    /* and open it */
  181.         set(win,MUIA_Window_ActiveObject,ST_Request);
  182.  
  183.         returnedObject = newStString("");
  184.  
  185.         while (running)
  186.         {
  187.             switch (DoMethod(AP_Small,MUIM_Application_Input,&signal))
  188.             {
  189.                 case MUIV_Application_ReturnID_Quit:
  190.                     running = FALSE;
  191.                     break;
  192.  
  193.                 case ID_REQU:
  194.                     get(ST_Request,MUIA_String_Contents,&text);
  195.                     running = FALSE;
  196.                     returnedObject = newStString(text);
  197.                     break;
  198.             }
  199.             if (running && signal) Wait(signal);
  200.         }
  201.  
  202.         set(win,MUIA_Window_Open,FALSE);    /* Close window */
  203.         DoMethod(AP_Small,OM_REMMEMBER,win);    /* remove */
  204.         MUI_DisposeObject(win);        /* and kill it */
  205.     }
  206.     set(AP_Small,MUIA_Application_Sleep,FALSE); /* wake up the application */
  207. }
  208.         break;
  209.  
  210.     case 204:    /* ask a question with a string reply */
  211.         c = charPtr(arguments[0]);
  212.         d = charPtr(arguments[1]);
  213. {
  214.     APTR win, TX_Request, ST_Request;
  215.     ULONG signal;
  216.     boolean running = TRUE;
  217.  
  218.     set(AP_Small,MUIA_Application_Sleep,TRUE);    /* disable other windows */
  219.     win = WindowObject, MUIA_Window_Title, "Smalltalk", MUIA_Window_ID, MAKE_ID('R','E','Q','U'), WindowContents,
  220.             VGroup,
  221.                 Child, TX_Request = TextObject,    TextFrame, End,
  222.                 Child, ST_Request = StringObject, StringFrame, End,
  223.                 End,
  224.             End;
  225.  
  226.     if (win)                /* ok ? */
  227.     {
  228.         DoMethod(AP_Small,OM_ADDMEMBER,win);    /* add window... */
  229.         DoMethod(ST_Request,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,MUIV_Notify_Application,2,MUIM_Application_ReturnID,ID_REQU);
  230.         set(TX_Request,MUIA_Text_Contents,c);
  231.         set(ST_Request,MUIA_String_Contents,d);
  232.         set(win,MUIA_Window_Open,TRUE);    /* and open it */
  233.         set(win,MUIA_Window_ActiveObject,ST_Request);
  234.  
  235.         returnedObject = newStString("");
  236.  
  237.         while (running)
  238.         {
  239.             switch (DoMethod(AP_Small,MUIM_Application_Input,&signal))
  240.             {
  241.                 case MUIV_Application_ReturnID_Quit:
  242.                     running = FALSE;
  243.                     break;
  244.  
  245.                 case ID_REQU:
  246.                     get(ST_Request,MUIA_String_Contents,&text);
  247.                     running = FALSE;
  248.                     returnedObject = newStString(text);
  249.                     break;
  250.             }
  251.             if (running && signal) Wait(signal);
  252.         }
  253.  
  254.         set(win,MUIA_Window_Open,FALSE);    /* Close window */
  255.         DoMethod(AP_Small,OM_REMMEMBER,win);    /* remove */
  256.         MUI_DisposeObject(win);        /* and kill it */
  257.     }
  258.     set(AP_Small,MUIA_Application_Sleep,FALSE); /* wake up the application */
  259. }
  260.         break;
  261.  
  262.     default:
  263.     fprintf(stderr,"primitive not implmented %d\n",
  264.         primitiveNumber);
  265.     sysError("primitive not implemented","");
  266.     }
  267.  
  268.     return returnedObject;
  269. }
  270.